package com.java.db;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;

public class DBProvider {
	/**
	 * 非事务时使用。通常用此方法即可。 查询操作
	 * 
	 * @param sql    查询语句
	 * @param rsh    结果集类型
	 * @param params sql语句的参数
	 * @return 查询结果
	 */
	public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params) {
		// 返回值
		T t = null;
		try {
			// 获取数据源对象
			DataSource ds = DBCPDataSource.getDataSource();
			// DBUtils需要使用QueryRunner查询器对象进行sql语句执行（QueryRunner等价于jdbc的Statement查询器）
			QueryRunner qr = new QueryRunner(ds, true);
			// 执行查询，获取查询结果集（List+Bean）
			t = qr.query(sql, rsh, params);

		} catch (SQLException e) {
			// 查询异常
			System.out.println("dbutils查询异常：");
			e.printStackTrace();
		}
		// 返回值
		return t;
	}

	/**
	 * 非事务时使用。通常使用此方法即可。 数据库的insert插入、update修改、delete删除操作
	 * 
	 * @param sql    执行的sql语句
	 * @param params sql语句的参数
	 * @return 执行结果
	 */
	public int update(String sql, Object... params) {
		// 返回值
		int i = -1;
		try {
			// 获取数据源对象
			DataSource ds = DBCPDataSource.getDataSource();
			// DBUtils需要使用QueryRunner查询器对象进行sql语句执行（QueryRunner等价于jdbc的Statement查询器）
			QueryRunner qr = new QueryRunner(ds, true);
			// 执行查询，获取查询结果集（List+Bean）
			i = qr.update(sql, params);

		} catch (SQLException e) {
			// 查询异常
			System.out.println("dbutils update异常：");
			e.printStackTrace();
		}
		// 返回值
		return i;
	}

	/**
	 * 事务时使用。 非事务时使用。通常用此方法即可。 查询操作
	 * 
	 * @param conn   数据库连接对象
	 * @param sql    查询语句
	 * @param rsh    结果集类型
	 * @param params sql语句的参数
	 * @return 查询结果
	 */
	public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) {
		// 返回值
		T t = null;
		try {

			// DBUtils需要使用QueryRunner查询器对象进行sql语句执行（QueryRunner等价于jdbc的Statement查询器）
			QueryRunner qr = new QueryRunner(true);
			// 执行查询，获取查询结果集（List+Bean）
			t = qr.query(conn, sql, rsh, params);

		} catch (SQLException e) {
			// 查询异常
			System.out.println("dbutils查询异常：");
			e.printStackTrace();
		}
		// 返回值
		return t;
	}

	/**
	 * 事务时使用。 数据库的insert插入、update修改、delete删除操作
	 * 
	 * @param conn   数据库连接对象
	 * @param sql    执行的sql语句
	 * @param params sql语句的参数
	 * @return 执行结果
	 */
	public int update(Connection conn, String sql, Object... params) throws SQLException {
		// 返回值
		int i = -1;
		try {
			// DBUtils需要使用QueryRunner查询器对象进行sql语句执行（QueryRunner等价于jdbc的Statement查询器）
			QueryRunner qr = new QueryRunner(true);
			// 执行查询，获取查询结果集（List+Bean）
			i = qr.update(conn, sql, params);

		} catch (SQLException e) {
			// 查询异常
			System.out.println("dbutils update异常：");
			e.printStackTrace();
		}
		// 返回值
		return i;
	}
}
